//八、参数按值传递
//ECMAScript中所有函数的参数都是按值传递的。
//按值传递:把函数外部的值复制给函数内部的参数，就和把值从一个变量复制到另一个变量一样
//参数传递机制:JavaScript中所有函数的参数都是按值传递的。这意味着函数外部的值会被复制到函数内部的参数中。

// 基本类型的传递
// 当传递基本类型（Number, String, Boolean, Null, Undefined, Symbol, BigInt）时，会创建该值的一个副本。

// 基本类型传递示例
let a = 10;
function changeValue(x) {
    // x 是 a 的副本
    x = 20;  // 修改的是副本
    console.log("函数内部:", x); // 20
}
changeValue(a);
console.log("函数外部:", a); // 10 (未改变)

// 引用类型的传递
// 当传递引用类型（Object, Array, Function）时，传递的是指向对象的引用（内存地址）的副本。这被称为共享传递。

// 引用类型传递示例
let obj = { value: 10 };
function changeObject(o) {
    // o 是 obj 引用的副本
    o.value = 20;  // 修改对象属性
    console.log("函数内部:", o.value); // 20
}
changeObject(obj);
console.log("函数外部:", obj.value); // 20 (已改变)

//共享传递
// 传递引用的副本，可以修改对象属性但不能重新赋值引用
let arr = [1, 2, 3];
function modifyArray(a) {
    a.push(4);     // 修改对象属性
    console.log(a, 'a1')
    a = [5, 6, 7]; // arr引用 重新赋值引用 ===》 无效  函数传参a [1,2,3,4]  ===> [5, 6, 7]
    console.log(a, 'a2')
}
modifyArray(arr);
console.log(arr); // [1, 2, 3, 4]

